iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 6
0

現在所有的OS都是interrupt driven,它只有有事情要處理的時候才會wake up,沒事的話最好什麼指令都不要下,讓CPU idle,這樣CPU utilization就會變很低,因為沒有人trigger任何interrupt,沒有人要執行instruction,但是它可以responsive。

有很多種方式可以trigger interrupt,特別是透過hardware跟software,只要不是program產生的interrupt就是hardware產生的,我們又稱呼它為,signal; software產生的interrupt,又稱呼為,trap,trap的意思就是你這個程式執行的這個動作,本來它應該去做別的事情,但是因為interrupt的關係所以它被trap到OS裡頭,因為所有的system call interrupt都會有由OS來做處理,所以你就trap到OS裡頭讓OS來決定這個function call或這個問題這個event要怎麼做處理。

那software這邊基本上一定就是triggered by program,尤其使用者的program裡頭會產生interrupt的狀況,最主要就是兩個,第一個是不預期的就像你的程式碼裡面有error,segmentation false這個被fail掉了,這個就是因為可能是除以零之類的,產生一個error,那為什麼error會變interrupt,因為當有一個像segmentation false產生出來的時候,代表什麼意思?你原來的程式沒有辦法繼續執,那為什麼不會變成整個crash?為什麼它還會好好的幫你print out一個segmentation false的message出來,原因就是當它detect到這些error的時候,我們的OS會throw一個interrupt,然後開始處理error的狀況,它至少會把這個program counter,reset到一個可以print out message的地方,就不會再繼續執行下去,換到別的後面recovery的動作的程式,你可以想見這需要很多處理的,而且是OS幫你處理,它沒有讓整個系統crash掉對不對?像你access到別人memory,它把你擋下來,然後throw你一個error message,所以這個是要OS處理,然後是軟體trigger的,所以就會產生這些error的時候就會透過interrupt,它發現除以零這個狀態一執行到這個指令,不是有效的field,它就直接丟一個interrupt,然後OS會有另外一個interrupt的handler去處理,讓這整個電腦繼續的運作,所以這個是你迫使OS去丟的。

另外一個狀況,其實最常見的就是system call了,所以程式碼要叫OS做事怎麼辦?你要call OS的API也就是system call,那所有的system call,你call下去跟一般的function call最大的不同在於它一定是透過interrupt,所以你可能感覺不出來,你覺得我也是printf就像你自己寫一個function A去call,所以好像只是program counter移到那而已,事實上完全不然,其實system call它的運作方式全部透過interrupt,也就是它是間接的,是你call了一個write out screen,這時候它會丟一個software interrupt出來,然後會等在那裡,等著OS去接,接了之後OS去看這個是對到哪一個subroutine或是哪一個routine來去handle,然後把它去做處理,處理完之後它才會通知你這個程式結束,那為什麼要間接處理?(後面在說系統怎麼被保護的時候會提到)因為你必須要透過interrupt,所以它可以區分你的這一個程式這個function call是OS的function call還是使用者的function call,若是使用者的function call,你就不需要透過interrupt,或是OS的你一定要透過interrupt,那透過interrupt的過程,它就可以做檢查,這個是不是有效的interrupt?因為這些哪些是有效的interrupt它全部都有define,所以你不能繞過去的。


上一篇
第五天 Interrupt-2
下一篇
第七天 Interrupt-4
系列文
30天~作業系統學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言